package testen;

import static org.junit.Assert.*;

import java.util.ArrayList;
import org.junit.Test;
import weighteddirectedgraph.WeightedDirectedGraph;

public class Weighted_Directed_Graph_Testen 
{
	private WeightedDirectedGraph<String, Integer> graaf = new WeightedDirectedGraph<String, Integer>();
	
	@Test
	public void Weighted_Directed_Graph_lege_graaf_geen_neighbors()
	{
		graaf.addItem("A");
		graaf.addItem("B");
		ArrayList<String> expected = new ArrayList<String>();
		assertEquals(expected,graaf.getNeighbourValues("A"));
	}
	
	@Test
	public void Weighted_Directed_Graph_add_Item()
	{
		graaf.addItem("A");
		graaf.addItem("B");
		graaf.addEdge("A", "B", 10);
		ArrayList<String> expected = new ArrayList<String>();
		expected.add("B");
		assertEquals(expected,graaf.getNeighbourValues("A"));
	}
	
	@Test
	public void Weighted_Directed_Graph_add_2Neighbors()
	{
		Weighted_Directed_Graph_add_Item();
		graaf.addItem("C");
		graaf.addEdge("A", "C", 12);
		ArrayList<String> expected = new ArrayList<String>();
		expected.add("B");
		expected.add("C");
		assertEquals(expected,graaf.getNeighbourValues("A"));
	}
	
	@Test
	public void Weighted_Directed_Graph_add_4Neighbors()
	{
		graaf.addItem("A");
		graaf.addItem("B");
		graaf.addItem("C");
		graaf.addItem("D");
		graaf.addItem("E");
		graaf.addEdge("A", "B", 10);
		graaf.addEdge("A", "C", 12);
		graaf.addEdge("A", "D", 8);
		graaf.addEdge("A", "E", 14);
		ArrayList<String> expected = new ArrayList<String>();
		expected.add("B");
		expected.add("C");
		expected.add("D");
		expected.add("E");
		assertEquals(expected,graaf.getNeighbourValues("A"));
	}
	
	@Test
	public void Weighted_Directed_Graph_add_OtherThenANeighbors()
	{
		graaf.addItem("A");
		graaf.addItem("B");
		graaf.addItem("C");
		graaf.addItem("D");
		graaf.addItem("E");
		graaf.addEdge("A", "B", 10);
		graaf.addEdge("B", "C", 12);
		graaf.addEdge("B", "D", 8);
		graaf.addEdge("B", "E", 14);
		ArrayList<String> expected = new ArrayList<String>();
		expected.add("C");
		expected.add("D");
		expected.add("E");
		assertEquals(expected,graaf.getNeighbourValues("B"));
	}
	
	@Test
	public void Weighted_Directed_Graph_cost()
	{
		Integer exp = 10;
		graaf.addItem("A");
		graaf.addItem("B");
		graaf.addEdge("A", "B", 10);
		assertEquals(exp,graaf.getCost("A","B"));
	}
	
	@Test
	public void Weighted_Directed_Graph_DepthFirst()
	{
		graaf.addItem("A");
		graaf.addItem("B");
		graaf.addItem("C");
		graaf.addEdge("A", "B", 10);
		graaf.addEdge("B", "C", 10);
		ArrayList<String> expected = new ArrayList<String>();
		expected.add("A");
		expected.add("B");
		expected.add("C");
		assertEquals(expected,graaf.bezoekDepthFirst("A"));
	}
	
	@Test
	public void Weighted_Directed_Graph_DepthFirstComplex()
	{
		graaf.addItem("A");
		graaf.addItem("B");
		graaf.addItem("C");
		graaf.addItem("D");
		graaf.addItem("E");
		graaf.addItem("F");
		graaf.addItem("G");
		graaf.addItem("H");
		graaf.addItem("I");
		graaf.addItem("J");
		graaf.addEdge("A", "B", 10);
		graaf.addEdge("B", "C", 10);
		graaf.addEdge("C", "D", 10);
		graaf.addEdge("C", "E", 10);
		graaf.addEdge("E", "F", 10);
		graaf.addEdge("E", "G", 10);
		graaf.addEdge("C", "H", 10);
		graaf.addEdge("G", "I", 10);
		graaf.addEdge("I", "J", 10);
		ArrayList<String> expected = new ArrayList<String>();
		expected.add("A");
		expected.add("B");
		expected.add("C");
		expected.add("D");
		expected.add("E");
		expected.add("F");
		expected.add("G");
		expected.add("I");
		expected.add("J");
		expected.add("H");
		
		assertEquals(expected,graaf.bezoekDepthFirst("A"));
	}
	
	@Test
	public void Weighted_Directed_Graph_BreadthFirstComplex()
	{
		graaf.addItem("A");
		graaf.addItem("B");
		graaf.addItem("C");
		graaf.addItem("D");
		graaf.addItem("E");
		graaf.addItem("F");
		graaf.addItem("G");
		graaf.addItem("H");
		graaf.addItem("I");
		graaf.addItem("J");
		graaf.addEdge("A", "B", 10);
		graaf.addEdge("B", "C", 10);
		graaf.addEdge("C", "D", 10);
		graaf.addEdge("C", "E", 10);
		graaf.addEdge("E", "F", 10);
		graaf.addEdge("E", "G", 10);
		graaf.addEdge("C", "H", 10);
		graaf.addEdge("G", "I", 10);
		graaf.addEdge("I", "J", 10);
		
		ArrayList<String> expected = new ArrayList<String>();
		expected.add("A");
		expected.add("B");
		expected.add("C");
		expected.add("D");
		expected.add("E");
		expected.add("H");
		expected.add("F");
		expected.add("G");
		expected.add("I");
		expected.add("J");
		
		assertEquals(expected,graaf.bezoekBreadthFirst("A"));
	}
	
	@Test
	public void Weighted_Directed_Graph_BreadthFirst_toseven()
	{
		graaf.addItem("A");
		graaf.addItem("B");
		graaf.addItem("C");
		graaf.addItem("D");
		graaf.addItem("E");
		graaf.addItem("F");
		graaf.addItem("H");
		graaf.addEdge("A", "B", 10);
		graaf.addEdge("B", "C", 10);
		graaf.addEdge("C", "D", 10);
		graaf.addEdge("C", "E", 10);
		graaf.addEdge("E", "F", 10);
		graaf.addEdge("C", "H", 10);
		ArrayList<String> expected = new ArrayList<String>();
		expected.add("A");
		expected.add("B");
		expected.add("C");
		expected.add("D");
		expected.add("E");
		expected.add("H");
		expected.add("F");
		
		assertEquals(expected,graaf.bezoekBreadthFirst("A"));
	}
	
	@Test
	public void Weighted_Directed_Graph_BreadthFirst_GEWOONEENTEST()
	{
		graaf.addItem("A");
		graaf.addItem("B");
		graaf.addItem("C");
		graaf.addItem("D");
		graaf.addItem("E");
		graaf.addItem("F");
		graaf.addItem("H");
		graaf.addEdge("A", "B", 10);
		graaf.addEdge("B", "C", 10);
		graaf.addEdge("C", "D", 10);
		graaf.addEdge("C", "E", 10);
		graaf.addEdge("E", "F", 10);
		graaf.addEdge("C", "H", 10);
		
		ArrayList<String> expected = new ArrayList<String>();
		expected.add("A");
		expected.add("B");
		expected.add("C");
		expected.add("D");
		expected.add("E");
		expected.add("H");
		expected.add("F");
		
		assertEquals(expected,graaf.bezoekBreadthFirst("A"));
	}
}
